// utils/http.js

// 导入模块
import Request from 'luch-request'
import {
  useUserStore
} from '@/stores/user.js'

// tabbar路径数组
const tabbarPaths = [
  'pages/index/index',
  'pages/wiki/index',
  'pages/notify/index',
  'pages/my/index',
]
const reLogin = () => {
  const pages = getCurrentPages()
  const curPage = pages[pages.length - 1]
  // 去fullPath，才能包含查询参数
  const url = curPage.$page.fullPath

  // curPage.$page.path 是不带查询参数的
  const isTabbar = tabbarPaths.includes(curPage.route)
  const type = isTabbar ? 'switchTab' : 'redirectTo'

  // 去登录之前要保存当前的url和跳转type到pinia中
  const UserStore = useUserStore()
  UserStore.setReturnUrl(url)
  UserStore.setReturnType(type)

  // 清除用户基本信息，token就在基本信息中
  UserStore.removeBasicInfo()

  uni.redirectTo({
    url: '/pages/login/index',
  })
}
// 实例化网络请求
const http = new Request({
  // 接口基地址
  baseURL: 'https://consult-api.itheima.net',
  custom: { //额外参数
    loading: true,
    loadingText: '加载中',
    showError: true, // 是否显示错误提示
  }
})

// 请求拦截器
http.interceptors.request.use((config) => {

  if (config.custom.loading) {
    uni.showLoading({
      title: config.custom.loadingText,
      mask: true
    })
  }
  const UserStore = useUserStore()
  // 定义头信息，并保证接口调用传递的头信息
  // 能够覆盖在拦截器定义的头信息
  const defaultHeader = {} // 默认请求头
  if (UserStore.setBasicInfo.token) {
    // 有token，才携带
    defaultHeader.Authorization = `Bearer ${UserStore.setBasicInfo.token}`
  }

  config.header = {
    ...defaultHeader,
    ...config.header,
  }

  return config
}, (err) => {
  uni.hideLoading()
  return Promise.reject(err)
})


// 响应拦截器
http.interceptors.response.use((res) => {
  uni.hideLoading()
  const {
    data
  } = res
  const {
    code,
    message
  } = data

  // 统一错误消息提示
  if (code !== 10000 && res.config.custom.showError) {
    uni.utils.toast(message)
    return Promise.reject(res)
  }

  return res.data
}, (err) => {
  if (err.statusCode === 401) {
    reLogin()
  }
  uni.hideLoading()
  return Promise.reject(err)
})
// 导出配置好的模网络模块
export {
  http
}